#ifndef _GAME_ENGINE_H
#define _GAME_ENGINE_H

#include <iostream>
using namespace std;

#include <QObject>
#include <vector>
#include "Board.h"
#include "Player.h"
#include "Move.h"

class GameEngine : public QObject
{
	Q_OBJECT

    private:
    
    	//Plateau du jeu
        Board* board;
        
        //Tableau des 2 joueurs de la partie
        Player* playerTable[2];
        
        //Liste des coups joués de la partie
        vector<Move> movesList;
        
        //Liste temporaire pour stocker les "coups légaux"
        vector<Move> regularMovesListTemp;
        
        //Player en train de joué
        int currentPlayer;
        
        //Partie terminé?
        bool isFinished;
        
        

        
    public:

		//Constructeur
        GameEngine();
        
		//Lance la partie		
		void startGame();
		
		//Accessuer de la variable 'board'
		Board* getBoard();

		//Initialise l'affichage
		void initializationDisplay();
	



	public slots:
	
        //Initilisation de la partie
        void initialization();

		//Récupération du coup à jouer
    	void recupMove(int,int);
    	
    	//Lance le tour de jeu suivant, si la partie n'est pas terminée
    	void nextTurn();
	
	

		
	private:
	
        //Mutateur de la variable 'isFinished'
        void setIsFinished(bool);
        //Accesseur de la variable 'isFinished'
        bool getIsFinished();

        //Accesseur de la variable 'currentPlayer'
        int getCurrentPlayer();


        //Passe au joueur suivant
        void nextPlayer();


        //Joue un coup dans la partie
        bool playMove(Move);


        //Définition des coups légaux
        void definingRegularMoves();
        //MAJ des coups légaux contenu ds 'regularMovesList' sur l'othellier
        void updateRegularMove();
        //Incrémentation du nb de 'coup légaux' des joueurs en fonction de la couleur
        void increaseRegularMove(ColorPawn);
        //Vérification d'un coup légal suivant plusieurs paramètres...
        bool checkRegularMove( int, int, int, int);


        //Ajoute le coup à la liste de coup
        void addMoveList(Move);
        //Efface la liste de moves joués
        void clearMovesList();


        //MAJ des scores des joueurs après le retournement d'un pion
        void updateScore();
        

        //MAJ des données du jeu après avoir joué un coup: MAJ othellier, MAJ Score
        bool updateGame(Move);
        //MAJ les pions de la ligne du coup joué
        void updateRow(Move);        
        //MAJ les pions de la colonne du coup joué
        void updateColumn(Move);
        //MAJ les pions des diagonales du coup joué
        void updateDiagonal(Move);


        //Demande un coup au moteur adéquate
        void askMove();


		//Renseigne le vainqueur
		void whoWins();

	//Gestion de l'affichage
        void updatingScoreDisplay();
        void updatingNumMovesDisplay();
        void updatingMovesListDisplay();
        void playerInitializationDisplay();

		void boardHasModified();
		



	signals:
		
		void boardModified();
		
		void playerScoreModified(Player*);
		void playerNumMovesModified(Player*);
		void playerNameModified(Player*);
		void playerColorModified(Player*);
		void playerTypeModified(Player*);
		void movesListModified(QString);
		
		void sendInfosGameDisplay(QString);
		
		void askingLocalMove();
		
		void playerWins( Player* );
		    	

};

#endif
